package auto.utils;
//
import cn.hutool.core.util.CharUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * json字符串转map工具类
 *
 * @author qigui.pan
 * @date 2021/5/7
 */

public class Common {


    /**
     * aes解密
     *
     * @param key        密钥
     * @param ciphertext 密文
     * @return 明文
     */
    public static String aesDecrypt(String key, String ciphertext) {
        return new String(SecureUtil.aes(StrUtil.padAfter(key, 16, CharUtil.DASHED)
                .getBytes(StandardCharsets.UTF_8)).decrypt(ciphertext));
    }


    /**
     * map转json,且key若是下划线格式转转小驼峰
     *
     * @param map map
     * @return JsonObject
     */
    public static JSONObject mapToJsonObject(Map<String, Object> map) {

        JSONObject r = new JSONObject();
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            r.put(StringUtil.toCamelCase(entry.getKey()), entry.getValue());
        }
        return r;
    }


    /**
     * mapList转jsonArray,运用场景数据库list转JsonArray，并把key转位小驼峰格式
     * @param list
     * @return
     */
    public static JSONArray mapListToJsonArray(List<Map<String, Object>> list) {

        JSONArray array = new JSONArray();
        for (Map<String, Object> stringObjectMap : list) {
            array.add(mapToJsonObject(stringObjectMap));
        }
        return array;
    }

    /**
     * DTO 转json对象
     *
     * @param dto
     * @return
     */
    public static JSONObject dtoToJsonObject(Object dto) {
        return JSON.parseObject(JSON.toJSONString(dto));
    }


    /**
     * 根据jsonpath删除json中的key
     *
     * @param json     JSON对象
     * @param jsonPath 要删除key值的jsonpath
     */
    public static void removeKey(JSONObject json, String jsonPath) {
        DocumentContext parse = JsonPath.parse(json);
        JsonPath compile = JsonPath.compile(jsonPath);
        parse.delete(compile);
    }


    /**
     * 可变形参转为TestNg可迭代的dataProvider格式
     *
     * @param item 可变形参
     * @return Iterator<Object [ ]>
     */
    public static Iterator<Object[]> dataProvider(Object... item) {
        List<Object[]> list = new ArrayList<>();
        for (Object u : item) {
            list.add(new Object[]{u});
        }
        return list.iterator();
    }

    /**
     * 休眠
     * @param sleepTime 毫秒
     */
    public static void sleep(int sleepTime){
        try{
            Thread.sleep(sleepTime);
        }catch (Exception ignored){}
    }
}
